/**
 *Copyright (c) 2024 watereyes
 * workflow is licensed under Mulan PubL v2.
 * You can use this software according to the terms and conditions of the Mulan
 * PubL v2.
 * You may obtain a copy of Mulan PubL v2 at:
 *          http://license.coscl.org.cn/MulanPubL-2.0
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PubL v2 for more details.
 */
package com.koron.workflow.workflowDesign.service;

import com.koron.workflow.common.bean.PageBean;
import com.koron.workflow.common.bean.StaffBean;
import com.koron.workflow.workflowDesign.bean.ProcessBean;
import com.koron.workflow.workflowDesign.bean.ProcessListQueryBean;
import com.koron.workflow.workflowDesign.bean.ProcessUpdateBean;
import com.koron.workflow.workflowDesign.bean.ProcessQueryBean;
import org.koron.ebs.mybatis.SessionFactory;
import org.swan.bean.MessageBean;

import java.util.List;
import java.util.Map;

/**
 * 模版管理
 */
public interface ProcessService {
    /**
     * 根据条件查询 模版管理 列表
     *
     * @param factory
     * @param appId    应用ID
     * @param setId    所属模版ID
     * @param code     模版编号
     * @param name     模版名称
     * @param status   状态 0:停用，1:启用
     * @param page
     * @param pageSize
     * @return
     */
    PageBean<ProcessQueryBean> queryForList(SessionFactory factory, StaffBean user, String appId,
                                            String setId, String code, String name,
                                            Integer status, Integer page, Integer pageSize);

    /**
     * 根据ID查询模版管理
     *
     * @param factory
     * @param id
     * @return
     */
    ProcessQueryBean queryForObject(SessionFactory factory, String id);

    /**
     * 保存模版管理
     *
     * @param user
     * @param bean
     * @return
     */
    MessageBean save(SessionFactory factory, StaffBean user, ProcessUpdateBean bean);

    /**
     * 修改模版管理
     *
     * @param user
     * @param bean
     * @return
     */
    MessageBean update(SessionFactory factory, StaffBean user, ProcessUpdateBean bean);

    /**
     * 删除模版管理
     *
     * @param id
     * @return
     */
    MessageBean delete(SessionFactory factory, String id);

    /**
     * 复制模版
     *
     * @param copyId 要复制的模版id
     * @param code   模版编号
     * @param name   模版名称
     * @return
     */
    MessageBean copyProcess(SessionFactory factory, String copyId, String code, String name);

    /**
     * 查询用户有设计权限的模版组
     *
     * @param factory
     * @param user
     * @return
     */
    List<Map> queryDesignProcessList(SessionFactory factory, StaffBean user);

    /**
     * 根据appid,setid,code获取流程id
     *
     * @param appCode
     * @param setCode
     * @param processCode
     * @return
     */
    ProcessBean getProcess(SessionFactory factory, String appCode, String setCode, String processCode);

    /**
     * 验证子流程编码
     *
     * @param factory
     * @param processCode
     * @return
     */
    boolean validateProcessCode(SessionFactory factory, String processCode);

    /**
     * 工作流列表
     *
     * @param factory
     * @param user
     * @param secret      RSA(时间戳+应用appCode，流程平台密钥)
     * @param setCode     流程组编号，为空查所有组的流程
     * @param processCode 工作流模板编号，为空查所有类型流程
     * @param billId      业务单据编号，为空查所有单据
     * @param title       标题，不为空模糊搜索
     * @param startDate   开始日期
     * @param endDate     结束日期
     * @param type        类型：1我发起的、2我待审的（未办理、可认领、可沟通）、3参与的(我发起、我已办理、我已沟通)、4我已沟通的、5我已办的（包含我发起和我已经办，不含待审）
     * @param status      状态：2已结束 1未结束 0或不传 所有
     * @param operator    操作人登陆帐号
     * @param page        第几页
     * @param pageSize    每页条数
     * @return
     */
    ProcessListQueryBean list(SessionFactory factory, StaffBean user, String secret, String setCode,
                              String processCode, String billId, String title,
                              String startDate, String endDate, Integer type,
                              Integer status, String operator, Integer page,
                              Integer pageSize);

    /**
     * 工作流模板定义信息
     * @param factory
     * @param secret      RSA(时间戳+应用appCode，流程平台密钥)
     * @param setCode     流程组编号，为空查所有组的流程
     * @param processCode 工作流模板编号，为空查所有类型流程
     * @return
     */
    List<Map<String, String>> define(SessionFactory factory, String secret, String setCode, String processCode);
}
